# 通用队列类
class Deque:
    def __init__(self):
        self.items = []
    
    def is_empty(self):
        return len(self.items) == 0
    
    def size(self):
        return len(self.items)
    
    def enqueue(self, item):
        """默认从队尾入队"""
        self.items.append(item)
    
    def dequeue(self):
        """默认从队首出队"""
        if self.is_empty():
            raise IndexError("dequeue from empty deque")
        return self.items.pop(0)
    
    def front(self):
        if self.is_empty():
            raise IndexError("front from empty deque")
        return self.items[0]
    
    def rear(self):
        if self.is_empty():
            raise IndexError("rear from empty deque")
        return self.items[-1]
    
    def __str__(self):
        return f"Deque: {self.items}"

# 双端队列类
class MyDeque(Deque):
    def add_front(self, item):
        """在队首添加元素"""
        self.items.insert(0, item)
    
    def add_rear(self, item):
        """在队尾添加元素（直接用Deque现有的方法）"""
        self.enqueue(item)
    
    def remove_front(self):
        """从队首移除元素（直接用Deque现有的方法）"""
        return self.dequeue()
    
    def remove_rear(self):
        """从队尾移除元素"""
        if self.is_empty():
            raise IndexError("remove_rear from empty deque")
        return self.items.pop()
    
    def __str__(self):
        return f"MyDeque: {self.items}"


# 测试代码
def test_deque():
    print("=== 测试通用队列 Deque ===")
    d = Deque()
    
    # 测试空队列状态
    print(f"是否为空: {d.is_empty()}")  # 应输出 True
    print(f"队列大小: {d.size()}")      # 应输出 0
    
    # 测试入队操作
    d.enqueue(10)
    d.enqueue(20)
    print(f"入队后: {d}")               # 应输出 Deque: [10, 20]
    
    # 测试查看队首和队尾元素
    print(f"队首元素: {d.front()}")     # 应输出 10
    print(f"队尾元素: {d.rear()}")      # 应输出 20
    
    # 测试出队操作
    item = d.dequeue()
    print(f"出队元素: {item}")          # 应输出 10
    print(f"出队后: {d}")               # 应输出 Deque: [20]
    
    # 测试队列状态
    print(f"是否为空: {d.is_empty()}")  # 应输出 False
    print(f"队列大小: {d.size()}")      # 应输出 1

def test_my_deque():
    print("\n=== 测试双端队列 MyDeque ===")
    md = MyDeque()
    
    # 测试空队列状态
    print(f"是否为空: {md.is_empty()}")  # 应输出 True
    print(f"队列大小: {md.size()}")      # 应输出 0
    
    # 测试双端添加元素
    md.add_front(100)
    md.add_rear(200)
    print(f"添加元素后: {md}")           # 应输出 MyDeque: [100, 200]
    
    # 测试双端移除元素
    item_front = md.remove_front()
    item_rear = md.remove_rear()
    print(f"队首移除: {item_front}")     # 应输出 100
    print(f"队尾移除: {item_rear}")      # 应输出 200
    print(f"移除后: {md}")               # 应输出 MyDeque: []
    
    # 测试异常处理
    try:
        md.remove_front()
    except IndexError as e:
        print(f"异常处理: {e}")          # 应输出异常信息

# 执行测试
test_deque()
test_my_deque()